package sensor;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

// 具体传感器类，实现数据采集和观察者管理
public class ConcreteSensor extends Sensor {
    private double currentValue; // 当前传感器值
    private boolean isWorking;   // 传感器工作状态
    private final List<Observer> observers = new ArrayList<>(); // 观察者列表
    private final Random random = new Random(); // 用于模拟传感器数据变化

    public ConcreteSensor() {
        this.isWorking = true; // 默认传感器处于工作状态
    }

    // 模拟传感器数据采集
    public void collectData() {
        if (isWorking) {
            // 模拟传感器数据变化（例如温度、湿度等）
            currentValue = 20 + random.nextDouble() * 10; // 生成20-30之间的随机值

            // 数据采集后通知所有观察者
            notifyObservers(currentValue);

            // 模拟异常情况（5%概率）
            if (random.nextDouble() < 0.05) {
                handleAbnormalData();
            }
        }
    }

    // 处理异常数据（触发责任链）
    private void handleAbnormalData() {
        // 创建异常事件并传递给责任链处理
        // 此处需要实现责任链模式的相关代码
        System.out.println("传感器数据异常，触发责任链处理...");
    }

    // 注册观察者
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
        System.out.println("观察者已注册: " + observer.getClass().getSimpleName());
    }

    // 移除观察者
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
        System.out.println("观察者已移除: " + observer.getClass().getSimpleName());
    }

    // 通知所有观察者
    @Override
    public void notifyObservers(double data) {
        for (Observer observer : observers) {
            observer.update(String.valueOf(data));
        }
    }

    // 启动传感器
    public void start() {
        isWorking = true;
        System.out.println("传感器已启动");
    }

    // 停止传感器
    public void stop() {
        isWorking = false;
        System.out.println("传感器已停止");
    }

    // 获取传感器状态
    public boolean getStatus() {
        return isWorking;
    }

    // 获取当前传感器值
    public double getCurrentValue() {
        return currentValue;
    }
}